package tk.mybatis.springboot.wexin.service.impl;

import java.util.Date;
import java.util.Map;

import org.apache.log4j.Logger;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import tk.mybatis.springboot.share.util.StringUtils;
import tk.mybatis.springboot.wexin.bean.WeChatMessageBean;
import tk.mybatis.springboot.wexin.enums.WechatMessageTypeEnum;
import tk.mybatis.springboot.wexin.service.WechatMessageService;

	/**setMsg_id
	 * 微信消息处理
	 * @title:WechatMessageServiceImpl
	 * @author Administrator
	 */
	@Service
	@Transactional(rollbackFor = Exception.class)
	public class WechatMessageServiceImpl implements WechatMessageService{

		private static Logger logger = Logger.getLogger(WechatMessageServiceImpl.class);

		@Override
		public WeChatMessageBean read(String to_user_name, String from_user_name, Date create_date, WechatMessageTypeEnum msg_type, String msg_id, Map<String, String> map) throws Exception {
			//必要字段不能为空
			if (StringUtils.isEmpty(to_user_name) || StringUtils.isEmpty(from_user_name) || null == msg_type) {
				return null;
			}
			String respContent = null;//回复内容
			String mediaId = null; //回复媒体id
			WechatMessageTypeEnum msgType = WechatMessageTypeEnum.text;//回复类型，默认的text
			switch (msg_type) {
			case CLICK:
				respContent = "您发送的是自定义菜单事件！";
				break;
			case event:
				// DOTO 这里是点击事件，可能包含其他
				// 事件类型
				String event = map.get("Event");
				WechatMessageTypeEnum eventType = WechatMessageTypeEnum.valueOf(event);
				// 关注

				if (eventType.equals(WechatMessageTypeEnum.subscribe)) {
					respContent = "亲爱的e粉，您好：\r\n欢迎关注「e车险保」\r\n互联网车险交易分享平台。\r\n主流车险比价，分享三重获益\r\n输入车牌即报价，保单免费到家"+
						"\r\n\r\n感谢您使用「e车险保」，如您在使用过程中有任何疑问，都可以致电「e车险保」专属客服电话：400-1088-006";
				}
				// 取消关注
				else if (eventType.equals(WechatMessageTypeEnum.unsubscribe)) {
					//取消关注后，微信会自动清空该用户的所有标签

				}
				// 自定义菜单
				else if (eventType.equals(WechatMessageTypeEnum.CLICK)) {
					String to_key = map.get("EventKey");

					if (StringUtils.isEmpty(to_key)) {
						break;
					}

					// TODO 处理菜单点击事件
					String keys = "";
					String butn_id = "";
					if (to_key.split("&").length >= 2) {
						keys = to_key.split("&")[0];
						butn_id = to_key.split("&")[1];
					} else {
						keys = to_key;
					}

//					if ("my_wallet_balance".equals(keys)) {
//						if (null != tMember) {
//							respContent = "您的钱包余额为:" + tMember.getBalance() + "元。";
//						} else {
//							respContent = "您未绑定公众号";
//						}
//					} else if ("return_text".equals(keys)) {

						if (StringUtils.isNotEmpty(butn_id)) {
							//查找返回语句
//							TWechatButton tWechatButton = wechat_WechatButtonMapper.selectByPrimaryKey(butn_id);
//
//							if (null != tWechatButton) {
//								respContent = tWechatButton.getText();
//							}

						}
//					}
				} else if (eventType.equals(WechatMessageTypeEnum.LOCATION)) {//被动推送地理位置
					//百度定位
//					//更新该用户的地理位置
//					if (null != tMember) {
//						//轨迹
//						BaiDuTraceTrackEntity baiDuTraceTrackEntity = new BaiDuTraceTrackEntity();
//						/**	entity唯一标识 */
//						baiDuTraceTrackEntity.setEntity_name(tMember.getUuid());
//						/** 维度(-90.0 , +90.0) */
//						baiDuTraceTrackEntity.setLatitude(Double.valueOf(map.get("Latitude")));
//						/** 经度(-90.0 , +90.0) */
//						baiDuTraceTrackEntity.setLongitude(Double.valueOf(map.get("Longitude")));
//						/** 坐标类型1：GPS经纬度坐标2：国测局加密经纬度坐标 3：百度加密经纬度坐标。 */
//						baiDuTraceTrackEntity.setCoord_type(1);
//
//						boolean is_add = BaiDuTraceUtil.track_addpoint(tMember.getUuid(), baiDuTraceTrackEntity);
//					}

				}

				break;
			case image:
				respContent = "您发送的是图片消息！";
				break;
			case link:
				respContent = "您发送的是链接消息！";
				break;
			case location://主动推送
				//更新该用户的地理位置
//				if (null != tMember) {
//					//轨迹
//					BaiDuTraceTrackEntity baiDuTraceTrackEntity = new BaiDuTraceTrackEntity();
//					/**	entity唯一标识 */
//					baiDuTraceTrackEntity.setEntity_name(tMember.getUuid());
//					/** 维度(-90.0 , +90.0) */
//					baiDuTraceTrackEntity.setLatitude(Double.valueOf(map.get("Location_X")));
//					/** 经度(-90.0 , +90.0) */
//					baiDuTraceTrackEntity.setLongitude(Double.valueOf(map.get("Location_Y")));
//					/** 坐标类型1：GPS经纬度坐标2：国测局加密经纬度坐标 3：百度加密经纬度坐标。 */
//					baiDuTraceTrackEntity.setCoord_type(3);
//
//					boolean is_add = BaiDuTraceUtil.track_addpoint(tMember.getUuid(), baiDuTraceTrackEntity);
//					if (is_add) {
//						respContent = "您已成功定位";
//					}
//				} else {
//					respContent = "您发送的是地理位置消息！";
//				}

				break;

			case music:
				// DOTO 不应该收到此消息
				msgType = null;
				break;
			case news:
				// DOTO 不应该收到此消息
				msgType = null;
				break;
			case subscribe: //关注
				// DOTO 不应该收到此消息
				break;
			case text:
				respContent = "您发送的是视频消息！";
				break;
			case unsubscribe://取消关注
				// DOTO 不应该收到此消息
				msgType = null;
				break;
			case video:
				respContent = "您发送的是视频消息！";
				break;
			case voice:
				respContent = "您发送的是语音消息！";
				break;
			case TEMPLATESENDJOBFINISH:
				//FIXME 这是通知
				break;
			default:
				break;

			}

			//如果消息处理不为空，那么则返回
			if (null != msgType) {
				if(StringUtils.isEmpty(respContent)){
					respContent = "你好";
				}
				respContent=new String(respContent.getBytes(), "iso8859-1");
				if (StringUtils.isEmpty(respContent) && StringUtils.isEmpty(mediaId)) {
					return null;
				}
				Date now = new Date();
				WeChatMessageBean weChatMessage = new WeChatMessageBean(from_user_name, to_user_name, now.getTime() + "", msgType, respContent, mediaId);
				return weChatMessage;
			}

			return null;
		}

		/**
		 * 发送微信消息
		 * @param user_uuid
		 * @param user_open_id
		 * @param temp_ident
		 * @param msg_map
		 */
//		public void send_message(final String user_uuid, final String user_open_id, final String temp_ident, final Map<String, WechatMessageData> msg_map) {
//			//发送一条消息，提示绑定
//			Thread t = new Thread(new Runnable() {
//				public void run() {
//					//延迟1秒，应该显示在默认信息之后
//					try {
//						Thread.sleep(1000);
//						messageService.send_by_weichat_message(user_uuid, user_open_id, temp_ident, msg_map);
//					} catch (Exception e) {
//						e.printStackTrace();
//					}
//				}
//			});
//			t.start();
//
//		}
	}
